package main

import (
	"fmt"
	"net/http"
	"project1/config"
	"project1/cronTask"
	"project1/db"
	"project1/routers"
	"runtime"
	"time"

	"github.com/kataras/iris/v12"
	"github.com/robfig/cron/v3"
)

/*

	1.最高权限秘钥：mememomokeyAuthKey123

*/

func main() {
	config.Init() // 初始化配置文件，不存在则自动创建
	db.Init()     // 初始化数据库及表

	app := iris.New()        // 创建实例
	app.Use(routerPrintln)   // 注册中间件
	routers.InitRouters(app) // 初始化路由

	// 注册服务器关闭事件
	h := app.NewHost(&http.Server{
		Addr:           "" + ":" + config.Conf.Router.Port, // 地址+端口
		Handler:        app,                                // 路由
		ReadTimeout:    30 * time.Second,                   // 读取请求头时超时时间
		WriteTimeout:   30 * time.Second,                   // 响应时的超时时间
		IdleTimeout:    2 * time.Minute,                    // 空闲状态下被关闭之前的最大时间
		MaxHeaderBytes: 1 << 20,                            // 请求头的最大字节数
	})
	h.RegisterOnShutdown(func() {
		defer fmt.Println("server terminated...")
		runtime.Goexit()
	}) // 注册服务器关闭事件

	// 打印已注册的路由
	routes := app.GetRoutes()
	fmt.Println("\n已注册路由:")
	for _, route := range routes {
		fmt.Printf("请求方式: %s  路由: %s\n", route.Method, route.Path)
	}
	fmt.Println("")

	// 检查数据库数据
	db.InitCheckSql()

	crontab := cron.New(cron.WithSeconds()) //精确到秒
	/*
		每日执行：1 0 0 * * ?
	*/
	crontab.AddFunc("*/30 * * * * ?", cronTask.IBusinessTask.UpdateUserOnlineStatus) // 每30秒更新一次所有用户表用户的在线状态

	crontab.Start()      // 启动定时任务
	defer crontab.Stop() // 关闭定时任务

	// 启动服务
	app.Run(iris.Raw(h.ListenAndServe), iris.WithoutServerError(iris.ErrServerClosed))
}

// 输出中间件
func routerPrintln(ctx iris.Context) {
	startTime := time.Now() // 记录开始时间

	// 继续处理请求
	ctx.Next()

	// 请求处理完成后获取执行耗时
	duration := time.Since(startTime)

	// 获取请求的相关信息
	clientIP := ctx.RemoteAddr()
	method := ctx.Method()
	path := ctx.Path()
	statusCode := ctx.GetStatusCode()

	// 格式化时间
	timestamp := time.Now().Format("2006-01-02 15:04:05.000")

	// 构建请求参数字符串
	params := ctx.URLParams() // 获取 URL 参数
	body := ctx.FormValues()  // 获取表单参数
	var paramsStr string

	// 如果有参数，将其格式化为字符串
	if len(params) > 0 {
		paramsStr = fmt.Sprintf("请求参数: %v", params)
	} else if len(body) > 0 {
		paramsStr = fmt.Sprintf("请求参数: %v", body)
	} else {
		paramsStr = "请求参数: 无"
	}

	// 打印日志
	fmt.Printf("\n[%s] -- %s [%s] %s [%d] %s %s\n", clientIP, timestamp, method, path, statusCode, duration, paramsStr)
}
